/********************************************************************************
 * Project Name		[JavaEE_Web]
 * File Name     	[JSP03.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package _notes.jsp;

/**
 * JSP的隐含对象和四个作用域对象
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public final class JSP03 {

	public void pageContext() {
		/**
		 * pageContext对象<br/>
		 * 
		 * 类型: javax.servlet.jsp.PageContext<br/>
		 * 
		 * 1. 封装了当前JSP页面的运行信息, 它提供了返回JSP页面的其他隐式对象的方法<br/>
		 * -----getRequest方法返回request隐含对象<br/>
		 * -----getSession方法返回session隐含对象<br/>
		 * -----getServletContext方法返回application隐含对象<br/>
		 * -----getOut方法返回out隐含对象<br/>
		 * -----getResponse方法返回response隐含对象<br/>
		 * -----getServletConfig方法返回config隐含对象<br/>
		 * -----getPage方法返回page隐含对象<br/>
		 * -----getException方法返回exception隐含对象<br/>
		 * 2. 有一个setAttribute方法来将对象存储进pageContext对象内部的一个HashMap对象中<br/>
		 * 3. 有一个getAttribute方法来检索存储在该HashMap对象中的对象<br/>
		 * 4. 除了可以存储和检索自身中的属性对象外, 还拥有可以存储和检索其他域范围内的属性对象的方法<br/>
		 * 5. 有forward()和include()方法, 用来替代RequestDispatcher类相应的方法.
		 * 传递给这两个方法的资源路径都只能是相对路径, 如果路径以/开头, 表示相对于当前Web应用的根目录, 否则表示相对于当前JSP所映射的路径
		 * <br/>
		 */

		/**
		 * JSP作用域对象<br/>
		 * 1. pageContext: 属性的作用范围仅限于当前JSP页面, 其他页面无法获得<br/>
		 * 2. request: 属性的作用范围仅限于同一个请求, 使用forward跳转之后可以取得属性,
		 * 但使用超链接跳转之后无法取得属性[超链接跳转也被称为客户端跳转, 浏览器地址栏会改变] <br/>
		 * 3. session: 属性的作用范围限于一次会话: 浏览器打开直到关闭称之为一次会话[在此期间会话不失效]<br/>
		 * 4. application: 属性的作用范围限于当前Web应用. 只要在一处设置属性, 在其他各处的JSP或Servlet中都可以获取到
		 * <br/>
		 * 
		 * 相关方法<br/>
		 * setAttribute(String attrName, Object attrValue);<br/>
		 * getAttribute(String attrName);<br/>
		 * removeAttribute(String attrName);<br/>
		 * Enumeration getAttributeNames();<br/>
		 * 
		 * 
		 * 此外pageContext还可以设置/获得/删除指定作用域的属性<br/>
		 * pageContext.setAttribute("attrName", Object value, int scope)<br/>
		 * pageContext.getAttribute("attrName", int scope)<br/>
		 * pageContext.removeAttribute("attrName", int scope)<br/>
		 * pageContext.findAttribute(String attrName);<br/>
		 * pageContext.getAttributeInScope(int scope);<br/>
		 * 其中findAttribute方法按照查找顺序"page->request->session->application"在这四个对象中去查找,
		 * 只要找到了就返回属性值, 如果四个对象都没有找到要查找的属性, 则返回一个null<br/>
		 * 
		 * scope的值只能为<br/>
		 * PageContext.PAGE_SCOPE<br/>
		 * PageContext.REQUEST_SCOPE<br/>
		 * PageContext.SESSION_SCOPE<br/>
		 * PageContext.APPLICATION_SCOPE<br/>
		 */
	}

	public void request() {
		/**
		 * request对象<br/>
		 * 
		 * 类型: javax.servlet.http.HttpServletRequest<br/>
		 */
	}

	public void session() {
		/**
		 * session对象<br/>
		 * 
		 * 类型: javax.servlet.http.HttpSession<br/>
		 */
	}

	public void application() {
		/**
		 * application对象<br/>
		 * 
		 * 类型: javax.servlet.ServletContext<br/>
		 */
	}

	public void out() {
		/**
		 * out对象<br/>
		 * 
		 * 类型: javax.servlet.jsp.JspWriter<br/>
		 * 
		 * 1. out对象用于向客户端发送文本数据<br/>
		 * 2. out对象通过调用pageContext对象的getOut方法返回的,
		 * 其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似<br/>
		 * 3. out对象的类型为JspWriter, JspWriter是一种带缓存功能的PrintWriter,
		 * 设置JSP页面的page指令的buffer属性可以调整它的缓存大小, 甚至关闭它的缓存<br/>
		 * 4. out对象相当于是ServletResponse.getWriter方法返回的PrintWriter对象前面的缓冲包装类对象
		 * <br/>
		 * 5. 只有向out对象中写入了内容, 且满足如下任何一个条件时,
		 * out对象才去调用ServletResponse.getWriter方法,
		 * 并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中<br/>
		 * 条件1: 设置page指令的buffer属性关闭了out对象的缓存功能<br/>
		 * 条件2: 写入到out对象中的内容充满了out对象的缓冲区<br/>
		 * 条件3: 整个JSP页面结束<br/>
		 */
	}

	public void response() {
		/**
		 * response对象<br/>
		 * 
		 * 类型: javax.servlet.http.HttpServletResponse<br/>
		 */
	}

	public void config() {
		/**
		 * config对象<br/>
		 * 
		 * 类型: javax.servlet.ServletConfig<br/>
		 */
	}

	public void page() {
		/**
		 * page对象<br/>
		 * 
		 * 类型: java.lang.Object<br/>
		 * 
		 * 1. page对象表示当前一个JSP页面, 可以理解为一个对象本身, 即: 把一个JSP当作一个对象来看待<br/>
		 */
	}

	public void exception() {
		/**
		 * exception对象<br/>
		 * 
		 * 类型: java.lang.Throwable<br/>
		 */
	}
}
